/*
本插件没有使用说明,具体请看实例m.gaohao.com的所有表单皆使用本插件编写
*/
var message = {
    requ: "输入的值不能为空",
    reg: "验证不通过!",
    eq: "两次输入的值不相等!",
    neq: "输入的值不能为{{value}}!",
    minLength: "输入的内容长度不能小于{{value}}位!",
    maxLength: "输入的内容长度不能大于{{value}}位!",
    key: "必须在{{count}}个中选择{{value}}个输入！",
    Number: "请输入数字",
    Phone: "请输入正确的电话",
    QqNumber: "请输入正确的QQ号",
    Email: "请输入正确的邮箱",
    WeiXin: "请输入正确的微信号",
    Url: "请输入正确的网址",
    Money: "请输入正确的金额",
    Time: "请输入正确的的时间",
    Identity: "请输入正确的身份证",
    BankCard: "请输入正确的银行卡号",
    Alipay: "请输入正确的支付宝账户",
};
var zy_form = function (v) {
    var id = null, css = {err: null, yes: null}, config = [];

    !function () {
        if (v == null || !v.id)
            return false;
        id = document.getElementById(v.id);
        if (v.config) {
            config = v.config;
        }
    }();

    function log(t) {
        console.log(t);
    }

    function each(v, f) {
        for (var i = 0; i < v.length; i++) {
            if ((f && f(i, v[i])) == false)
                break;
        }
    }

    function isFrom(t) {
        if (t.type == "submit" || t.type == "button" || t.type == "reset")
            return false;
        return true;
    }

    function getConfig(n) {
        var ret = false;
        each(config, function (i, t) {
            if (n == t.name) {
                ret = t;
                return false;
            }
        });
        return ret;
    }

    function getRegular(r) {
        if (r == "number") {
            return /^-?\d+$/;
        } else if (r == "phone") {
            return /^1[34578]\d{9}$/;
        } else if (r == "qq") {
            return /^[1-9][0-9]{4,14}$/;
        } else if (r == "weiXin") {
            return /^[a-zA-Z][a-zA-Z0-9_-]{5,19}$/;
        } else if (r == "email") {
            return /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
        } else if (r == "url") {
            return /^(http|https|ftp)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$/;
        } else if (r == "money") {
            return /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
        } else if (r == "time") {
            return /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/;
        } else {
            return r;
        }
    }

    var zy_msg = function (m) {
        alert(m);
    };

    function error_bak(p, k, t) {
        if (p.message) {
            if (typeof p.message == "string") {
                zy_msg(p.message);
            } else if (typeof p.message == "function") {
                p.message(k);
            } else {
                if (typeof p.message[k] == "string") {
                    zy_msg(p.message);
                } else if (typeof p.message[k] == "function") {
                    p.message[k](k);
                } else {
                    zy_msg(message[k]);
                }
            }
        } else {
            if (typeof v.message == "string") {
                alert(v.message);
            } else if (typeof v.message == "function") {
                v.message(k);
            } else {
                zy_msg(message[k]);
            }
        }
        t.focus();
    }

    function error(p, k, t) {
        if (v.message) {
            if (typeof v.message == "string") {
                alert(v.message);
            } else if (typeof v.message == "function") {
                if (typeof p.message == "string") {
                    v.message(p.message);
                } else if (typeof p.message == "object") {
                    if (v.message[k]) {
                        v.message(p.message[k]);
                    } else {
                        v.message(message[k]);
                    }
                } else {
                    v.message(message[k]);
                }
            }
        } else if (p.message) {
            if (typeof p.message == "string") {
                zy_msg(p.message);
            } else if (typeof p.message == "function") {
                p.message(message[k]);
            } else {
                if (typeof p.message[k] == "string") {
                    zy_msg(p.message);
                } else if (typeof p.message[k] == "function") {
                    p.message[k](message[k]);
                } else {
                    zy_msg(message[k]);
                }
            }
        } else {
            zy_msg(message[k]);
        }
        t.focus();
    }

    function getValue(n) {
        for (var i = 0; i < id.length; i++) {
            if (isFrom(id[i])) {
                if (id[i].name == n) {
                    return id[i].value;
                }
            }
        }
        return false;
    }
    function before(d,c) {//返回false不进行验证
        var val = d.value;
        var ver = c.ver;
        if(ver && typeof ver.requ=="function"){
            var f= ver.requ(d);
            if(f==false){
                return false;
            }
        }
    }
    function after(d,c) {
        var val = d.value;
        var ver = c.ver;

    }
    function yzFun(d,c) {
        var val = d.value;
        var ver = c.ver;
        if (val) {
            if (!ver) {
                return true;
            }
            if (ver.eq) {
                var valt = getValue(ver.eq);
                if (valt != val) {
                    error(c, "eq", d);
                    return false;
                }
            }
            if (ver.neq) {
                if (ver.neq == val) {
                    error(c, "neq", d);
                    return false;
                }
            }
            if (ver.minLength) {
                if (val.length < ver.minLength) {
                    error(c, "minLength", d);
                    return false;
                }
            }
            if (ver.maxLength) {
                if (val.length > ver.maxLength) {
                    error(c, "minLength", d);
                    return false;
                }
            }
            if (ver.Number) {
                var z = /^-?\d+$/.test(val);
                if (!z) {
                    error(c, "Number", d);
                    return false;
                }
            }
            if (ver.Phone) {
                var z = /^1[34578]\d{9}$/.test(val);
                if (!z) {
                    error(c, "Phone", d);
                    return false;
                }
            }
            if (ver.QqNumber) {
                var z = /^[1-9][0-9]{4,14}$/.test(val);
                if (!z) {
                    error(c, "QqNumber", d);
                    return false;
                }
            }
            if (ver.Email) {
                var z = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(val);
                if (!z) {
                    error(c, "Email", d);
                    return false;
                }
            }
            if (ver.Url) {
                var z = /^(http|https|ftp)\:\/\/([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*$/.test(val);
                if (!z) {
                    error(c, "Url", d);
                    return false;
                }
            }
            if (ver.Money) {
                var z = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(val);
                if (!z) {
                    error(c, "Money", d);
                    return false;
                }
            }
            if (ver.Time) {
                var z = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/.test(val);
                if (!z) {
                    error(c, "Time", d);
                    return false;
                }
            }
            if (ver.WeiXin) {
                var z = /^[a-zA-Z][a-zA-Z0-9_-]{5,19}$/.test(val);
                if (!z) {
                    error(c, "WeiXin", d);
                    return false;
                }
            }
            if (ver.Identity) {
                var z = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/.test(val);
                if (!z) {
                    error(c, "Identity", d);
                    return false;
                }
            }
            if (ver.BankCard) {
                var z = /^([\d]{4})([\d]{4})([\d]{4})([\d]{4})([\d]{0,})?/.test(val);
                if (!z) {
                    error(c, "BankCard", d);
                    return false;
                }
            }
            if (ver.Alipay) {
                var z = /^(?:\w+\.?)*\w+@(?:\w+\.)+\w+|\d{9,11}$/.test(val);
                if (!z) {
                    error(c, "Alipay", d);
                    return false;
                }
            }
            if (ver.reg) {
                if (typeof  ver.reg == "function") {
                    var f = ver.reg(d);
                    if (f == false)
                        return false;
                } else {
                    var z = ver.reg.test(val);
                    if (!z) {
                        error(c, "reg", d);
                        return false;
                    }
                }
            }
        } else {
            //验证是否为必填项
            if (!ver || (ver.requ != false && !ver.reg)) {
                error(c, "requ", d);
                return false;
            }
            //验证是否为方法
            if (ver.reg) {
                if (typeof  ver.reg == "function") {
                    var f = ver.reg(d);
                    if (f == false)
                        return false;
                } else {
                    var z = ver.reg.test(val);
                    if (!z) {
                        error(c, "reg", d);
                        return false;
                    }
                }
            }
        }
    }
    function vdata(d, c) {//d对象 ver验证配置
        //取值
        if(before(d,c)!=false){
            //验证值是否为空
            if(yzFun(d,c)==false){
                after(d,c);
                return false;
            }
            after(d,c);
        }
    }

    id.onsubmit = function (fr) {
        var fp = fr.target;
        var eit = [];

        function addEit(t, e) {
            for (var i = 0; eit.length; i++) {
                if (eit[i].key == e[0]) {
                    eit[i].vals.push(t);
                    return;
                }
            }
            eit.push({key: e[0], vals: [t], number: (e[1] != null ? e[1] : 1)});
        }

        function getValue(n) {
            for (var i = 0; i < fp.length; i++) {
                var t = pf[i];
                //验证是否为支持控件
                if (isFrom(t) == false) {
                    continue;
                }
                if (t.name == n) {
                    var ti = getMessage(cons, name);
                    if (ti && ti.regular) {
                        var reg = getRegular(ti.regular);//正则
                        if (reg.test(t.value) == false)
                            return false;
                        else
                            return t.value;
                    }
                }
            }
            return false;
        }

        //单个循环验证
        for (var i = 0; i < fp.length; i++) {
            if (vdata(fp[i], getConfig(fp[i].name)) == false)
                return false;
        }
        if (v.adopt) {
            v.adopt(fr);
            if (v.adopt(fr) == false) {
                return false;
            }
        }
        return true;
    }
};